/*
 * Juego.cpp
 *
 *  Created on: 24/03/2013
 *      Author: Juliansci
 */

#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include <string>
#include <iostream>
#include "Juego.h"
#include <math.h>
#include "util/Mousemapping.h"
#include "../vista/VentanaChat.h"

Juego::Juego(Escenario* escenario, Pantalla* pantalla) {
	cout << "Inicializo juego" << endl;
	this->escenario = escenario;
	this->pantalla = pantalla;
}

void Juego::mostrar(){
	SDL_Flip(this->screen);
}


int Juego::iniciar(map<string,TipoEntidad*> mapaTipoEntidad) {

	cout << "Inicializo el juego" << endl;

	//Variables para manejar el scroll;
	int cursorX = 50;
	int cursorY = 50;

	Vista* vista;
	//VentanaChat *ventanaChat;

	//Hay que pasarle el alto y el ancho de la pantalla que viene del parser.
	/*SDL_Surface *screen = SDL_SetVideoMode(this->pantalla->getAncho(),
			this->pantalla->getAlto(), BPP_PANTALLA,
			SDL_DOUBLEBUF | SDL_SWSURFACE);*/

	this->screen = SDL_SetVideoMode(this->pantalla->getAncho(),
			this->pantalla->getAlto(), BPP_PANTALLA,
			SDL_DOUBLEBUF | SDL_SWSURFACE);

	if (screen == NULL) {
		printf("Error: %s\n", SDL_GetError());
		return false;
	}

	cout << "Inicialice la pantalla" << endl;

	cout << "Voy a inicializar la vista" << endl;
	vista = new Vista(mapaTipoEntidad, screen);
	cout << "Inicialice la vista" << endl;

	//ventanaChat = new VentanaChat(screen, this->escenario->getProtagonista());
	//ventanaChat->start();
	/*--------------------- seteo las coordenadas iniciales centradas en el protagonista --------*/

	int tile_x= this->getEscenario()->getProtagonista("juan")->getX();
	int tile_y= this->getEscenario()->getProtagonista("juan")->getY();
	int px = (tile_x - tile_y) * (TILE_ANCHO / 2) - 350;
	int py = (tile_x + tile_y) * (TILE_ALTO / 2)-300 + TILE_ALTO;
	pantalla->setScrollX(px );
	pantalla->setScrollY(py);

	/*--------------------------------------------------------------*/
	//Inicializa el mapa de animaciones del escenario y dibuja los tiles

	escenario->inicializarNiebla("juan");
	cout << "Inicialice la niebla" << endl;
	vista->dibujarEscenario(escenario, pantalla);

	bool salir = false;
	SDL_Event ev;

	//Posicion original del cursor

	double minX = -((64 * escenario->getAncho()) / 2) + 32;
	double maxX = ((64 * escenario->getAncho()) / 2) - pantalla->getAncho()
			+ 32;
	double maxY = ((32 * escenario->getAlto()) - (pantalla->getAlto())) + TILE_ALTO;

	pair<int, int> parPosiciones;
	pair<int, int> coord;
	bool puedeMover;
	bool puedeCambiarCasilla = false;
	bool hizoClick = false;
	bool presionoA = false;
	bool presionoS = false;

	Timer timer;
	Mousemapping unMouseMapping;

	while (!salir) {

		timer.comenzar();

		if (cursorX < pantalla->getMargenScroll()
				&& (pantalla->getScrollX() > minX)) {
			pantalla->setScrollX(pantalla->getScrollX() - 5);
			//Si despues de mover no hay vertices en pantalla, vuelvo un paso atras
			if (!unMouseMapping.verticeVisibleEnPantalla(escenario, pantalla))
				pantalla->setScrollX(pantalla->getScrollX() + 5);

		}

		if ((cursorX > (pantalla->getAncho() - pantalla->getMargenScroll()))
				&& (pantalla->getScrollX() < maxX)) {
			pantalla->setScrollX(pantalla->getScrollX() + 5);
			//Si despues de mover no hay vertices en pantalla, vuelvo un paso atras
			if (!unMouseMapping.verticeVisibleEnPantalla(escenario, pantalla))
				pantalla->setScrollX(pantalla->getScrollX() - 5);


		}
		if (cursorY < pantalla->getMargenScroll()
				&& (pantalla->getScrollY() > 0)) {
			pantalla->setScrollY(pantalla->getScrollY() - 5);

			//Si despues de mover no hay vertices en pantalla, vuelvo un paso atras
			if (!unMouseMapping.verticeVisibleEnPantalla(escenario, pantalla))
				pantalla->setScrollY(pantalla->getScrollY() + 5);
		}

		if ((cursorY > (pantalla->getAlto() - pantalla->getMargenScroll()))
				&& (pantalla->getScrollY() < maxY)) {
			pantalla->setScrollY(pantalla->getScrollY() + 5);

			//Si despues de mover no hay vertices en pantalla, vuelvo un paso atras
			if (!unMouseMapping.verticeVisibleEnPantalla(escenario, pantalla))
				pantalla->setScrollY(pantalla->getScrollY() - 5);
		}

		//Actualizo el escenario
		vista->actualizarEscenario(escenario, pantalla);
		escenario->avanzarAnimaciones(timer.get_ticks());

		//Dibujo el chat
		//ventanaChat->run();

		//Muestro todo por pantalla
		this->mostrar();

	    //muevo los personajes protagonistas del mapa.//
		if (puedeCambiarCasilla) {
			puedeMover = escenario->actualizarPosicionPersonaje();
			if (!puedeMover) {
				puedeCambiarCasilla = escenario->cambiarCasillaPersonaje();
			}
		}

		//Entro aca si hizo click mientras estaba caminando
		if (hizoClick && escenario->getProtagonistas().front()->getdx() == 0
				&& escenario->getProtagonistas().front()->getdy() == 0) {
			Casilla* casillaDestino = escenario->getCasilla(coord.first,
					coord.second);
			Casilla* casillaOrigen =
					escenario->getCasilla(
							escenario->getProtagonistas().front()->getX(),
							escenario->getProtagonistas().front()->getY());
			escenario->calcularCaminoPersonaje(casillaOrigen, casillaDestino);
			puedeCambiarCasilla = true;
			hizoClick = false;
		}

		//Presiono A mientras estaba caminando
		if (presionoA && escenario->getProtagonistas().front()->getdx() == 0
						&& escenario->getProtagonistas().front()->getdy() == 0){
	//		cout << "ENTRO ACA LA CONCHA DE TU MADRE " << endl;
	//		escenario->terminarCaminoProtagonista();
			cout << "PRESIONO A MIENTRAS ESTA CAMINANDO" << endl;
			cout << "ULTIMA DIRECCION MOVIMIENTO: " << escenario->getProtagonistas().front()->getDireccionMovimiento() << endl;
			escenario->getProtagonista("juan")->armarAccion("atacar");
			presionoA = false;
		}

		//Presiono S mientras estaba caminando
		if (presionoS && escenario->getProtagonistas().front()->getdx() == 0
						&& escenario->getProtagonistas().front()->getdy() == 0){
			cout << "PRESIONO S MIENTRAS ESTA CAMINANDO" << endl;
			cout << "ULTIMA DIRECCION MOVIMIENTO: " << escenario->getProtagonistas().front()->getDireccionMovimiento() << endl;
			escenario->getProtagonista("juan")->armarAccion("defenderse");
			presionoS = false;
		}

		while (SDL_PollEvent(&ev)) {

			//ventanaChat->escucharEventos(ev);

			//if (ventanaChat->getEventoSobreVentana() == false){

				switch (ev.type) {
				case SDL_KEYDOWN:

					if (ev.key.keysym.sym == SDLK_ESCAPE) {
					}
					//Me fijo si presiona A para atacar
					if (ev.key.keysym.sym == SDLK_a) {
						cout << "TOCO A GIL "<< endl;
						presionoA = true;
						//Corto el camino del protagonista
						escenario->terminarCaminoProtagonista();
						//Me fijo si llego al centro del tile siguiente
						if (escenario->getProtagonistas().front()->getdx() == 0
							&& escenario->getProtagonistas().front()->getdy()== 0) {
											cout << "PRESIONO A CUANDO YA ESTA PARADO" << endl;
											cout << "ULTIMA DIRECCION MOVIMIENTO: " << escenario->getProtagonistas().front()->getDireccionMovimiento() << endl;
											escenario->getProtagonista("juan")->armarAccion("atacar");
											presionoA = false;
						}
					}

					//Me fijo si presiona S para defenderse
					if (ev.key.keysym.sym == SDLK_s) {
						cout << "TOCO S GIL "<< endl;
						presionoS = true;
						//Corto el camino del protagonista
						escenario->terminarCaminoProtagonista();
						//Me fijo si llego al centro del tile siguiente
						if (escenario->getProtagonistas().front()->getdx() == 0
							&& escenario->getProtagonistas().front()->getdy()== 0) {
											cout << "PRESIONO S CUANDO YA ESTA PARADO" << endl;
											cout << "ULTIMA DIRECCION MOVIMIENTO: " << escenario->getProtagonistas().front()->getDireccionMovimiento() << endl;
											escenario->getProtagonista("juan")->armarAccion("defenderse");
											presionoS = false;
						}
					}

					break;

					//Movimiento del raton
				case SDL_MOUSEMOTION:
					cursorX = ev.motion.x;
					cursorY = ev.motion.y;

					//Dibujamos


					break;
				case SDL_MOUSEBUTTONDOWN:
					if (ev.button.button == SDL_BUTTON_LEFT) {
						cout << "left click ---------------------" << endl;

						int x = ev.button.x;
						int y = ev.button.y;

						coord = unMouseMapping.obtenerCoordLogicas(escenario,
								pantalla, x, y);
						cout << "CLICK en x: " << coord.first << " y: " << coord.second << endl;
						if(coord.first < 0 || coord.second < 0 || coord.first >= escenario->getAncho() || coord.second >= escenario->getAlto()){
							continue;
						}
/*
						cout << "Voy a verificar si hay un personaje donde hicieron click" << endl;
 						list<Personaje*> listaPersonajes = escenario->getCasilla(coord.first, coord.second)->getPersonajes();
						if (listaPersonajes.size()>0){
							escenario->getProtagonistas().front()->personajeAtacar=listaPersonajes.front();
							cout<< "seteo personaje atacar" << endl;
						}	else {
							escenario->getProtagonistas().front()->personajeAtacar = NULL;
							cout << "seteo personaje atacar en NULL" << endl;
						}
*/

						hizoClick = true;
						if (escenario->getProtagonistas().front()->getdx() == 0
								&& escenario->getProtagonistas().front()->getdy()
										== 0) {
							cout << "ENTRO A CAMINAR MIENTRAS ESTA ATACANDO" << endl;
							Casilla* casillaDestino = escenario->getCasilla(coord.first, coord.second);

							Casilla* casillaOrigen =
									escenario->getCasilla(
											escenario->getProtagonistas().front()->getX(),
											escenario->getProtagonistas().front()->getY());
							escenario->calcularCaminoPersonaje(casillaOrigen,
									casillaDestino);
							puedeCambiarCasilla = true;
							hizoClick = false;

						}
					}


					if (ev.button.button == SDL_BUTTON_RIGHT) {
						int x = ev.button.x;
						int y = ev.button.y;
						Casilla* casillaClickeada=NULL;
						Personaje* personajeEnCasilla=NULL;
						coord = unMouseMapping.obtenerCoordLogicas(escenario, pantalla, x, y);
						if(coord.first >= 0 || coord.second >= 0 || coord.first < escenario->getAncho() || coord.second < escenario->getAlto()){
							casillaClickeada = escenario->getCasilla(coord.first, coord.second);
							list<Personaje*> listaPersonajes = casillaClickeada->getPersonajes();

							if (listaPersonajes.size()>0){
								personajeEnCasilla =listaPersonajes.front();
							}
						}

						if (personajeEnCasilla!= NULL){
							//ventanaChat->setVisible(true);
						}

						/*coord = unMouseMapping.obtenerCoordLogicas(escenario,
								pantalla, x, y);
						cout << "CLICK en x: " << coord.first << " y: " << coord.second << endl;
						if(coord.first < 0 || coord.second < 0 || coord.first >= escenario->getAncho() || coord.second >= escenario->getAlto()){
							continue;
						}

					hizoClick = true;
						if (escenario->getProtagonistas().front()->getdx() == 0
								&& escenario->getProtagonistas().front()->getdy()
										== 0) {
							Casilla* casillaDestino = escenario->getCasilla(
									coord.first, coord.second);

							Casilla* casillaOrigen =
									escenario->getCasilla(
											escenario->getProtagonistas().front()->getCasillaActual()->getX(),
											escenario->getProtagonistas().front()->getCasillaActual()->getY());
							escenario->calcularCaminoPersonaje(casillaOrigen,
									casillaDestino);
							puedeCambiarCasilla = true;
							hizoClick = false;*/


					}

					break;
				case SDL_QUIT:
					salir = 1;
					//SDL_Quit();
					//return 0;
					break;
				}
			//}

		}

	/*
	 * Si necesitamos darle una velocidad determinada al juego:
	 *
	 * 	if (timer.get_ticks() < 1000 / VELOCIDAD_JUEGO) {
			SDL_Delay((1000 / VELOCIDAD_JUEGO) - timer.get_ticks());
		}
*/
		//vista->avanzarAnimacion(p);
	}

	delete escenario;
	return 0;
}

Juego::~Juego() {
	// TODO Auto-generated destructor stub
}
